//Листинг 1-4 Отслеживание прогресса загрузки файлов на сервер (js)
// Файл js/uploader.js
 
/**
* Случайная строка для обозначения идентификатора загрузки
* @var string
*/
var token = '';
 
/**
* Идентификатор таймера до выполнения очередного запроса
* @var int
*/
var taskTimer = null;
 
/**
* Отправка запроса на загрузку файла
* @return void
*/
function uploadFile(path)
{
    //Формируем случайны "токен" для идентификатора загрузки
    var d = new Date();
    token = d.getTime()+ Math.floor(Math.random()*10000);
    //Присаеваем значение "токена" занчению скрытова поля UPLOAD_IDENTIFIER
    Ext.fly('uploadId').dom.value = token;
    var ajax = {
        'url'   : path, // Скрипт обработки загрузки
        'form'   : 'fileUploader', // Идентификатор формы
        'isUpload' : true, // Указываем на то, что будем загружать файл
        'success' : uploadSuccess, // Функция обработки результата запроса
        'filure'  : requestFilure // Функция обработки ошибок соеденения
    };
    Ext.Ajax.request(ajax); // Отправка запроса
    //Прячем поле для выбора файла (не забудьте его потом показать)
    Ext.fly('input-file').setVisible(false);
    //Создаем объект ссылки-отмены
    var config = {
        tag: 'a',
        href: 'javascript:void(0)',
        html: 'Отменить',
        id: 'uploadCancel'
    };
    var a = Ext.getBody().createChild(config);
    //Назначаем действие - вызов функции cancelUpload
   // a.on('click', cancelUpload);
    // Отправить запрос на получение статистики через полторы секунды
    taskTimer = setTimeout(checkUploadStatus, 9000);
} // uploadFile

/**
* Функция обработки нажатия на кнопку "отмена загрузки"
* @param e Объект события
* @param t Указатель на объект источник
* @return void
*/
function cancelUpload (e, t)
{
    //Получаем объект кнопки
    var bt = Ext.get('uploadCancel');
    //Прекращаем отсылку запросов на получение информации о загрузки
    clearTimeout(taskTimer);
//    //Ищем все скрытые iframe-ы
    var iframes = Ext.getBody().select('iframe.x-hidden');
    if (iframes.getCount() > 0) {
        //Если фрэймы есть - берем первый
        var iframe = iframes.item(0);
        // Закрываем соеденение
        iframe.dom.contentWindow.close();
        // Удаляем фрэйм
        iframe.remove();
    }
    //удаляем кнопку отмены
    bt.remove();
    //Делаем поле для выбора файла видимым
    Ext.fly('input-file').setVisible(true);
} // uploadCancel
 
/**
* Функция, для отправки запроса на получения даных о загрузке
* (выполняется периодически)
* @return void
*/
function checkUploadStatus() {
    taskTimer = null;
    var ajax = {
        'url': 'check-upload.php', // Скрипт получения статистики
        'params': {'token': token}, // Передача токена
        'success' : checkSuccess // Обработчик
    };
    Ext.Ajax.request(ajax);
}//checkUploadStatus()
 
/**
* Обработка прогресса загрузки
* @param response XMLHttpRequest объект запроса
* @param options Объект конфигурации запроса
* @return void
*/
function checkSuccess (response, option) 
{
    var result = Ext.util.JSON.decode(response.responseText);
    if (result.success) { //Если все ОК, то заполняем отчет
        Ext.fly('upload-report').dom.innerHTML = "Прогресс: " + result.progress;
        //Ставим еще один запрос на статистику через полторы секунды
        taskTimer = setTimeout(checkUploadStatus, 1000);
    } 
	else
	{
		cancelUpload(null, null);
        Ext.fly('upload-report').dom.innerHTML = "Ошибка передачи (возможно файл слишком большой)";
    }

} // checkSuccess
 
 
function absPath(url){  
	var Loc = location.href;      
	Loc = Loc.substring(0, Loc.lastIndexOf('/'));  
	while (/^\.\./.test(url)){         
		Loc = Loc.substring(0, Loc.lastIndexOf('/'));  
		url= url.substring(3);  
	}  
	return Loc + '/' + url;  
}
/**
* Обработка выполненого запроса
* Если загрузка удалась, то выводим информацию о файле,
* иначе сообщаем о неудаче
* @param response XMLHttpRequest объект запроса
* @param options Объект конфигурации запроса
* @return void
*/
function uploadSuccess (response)
{
    // Расшифровка ответа
    var result = Ext.util.JSON.decode(response.responseText);
    // Остановка задачи по првоерки статуса загрузки
    clearTimeout(taskTimer);
    var report = result.msg;
    Ext.fly('upload-report').dom.innerHTML = report;
	if (result.success == true) {
		Ext.fly('files').dom.innerHTML += '<li id="'+result.msg2+'"><img style="max-height:200px;max-width:200px;" src="' + result.msg2 + '"><input type="button" onClick="DeleteUpload(\''+result.msg2+'\')" value="Delete"><input type="hidden" name="pic[]" value="' + result.msg2 + '"></li>';
	}
	//$("<li>" + result.name + "</li>").appendTo("#files");
    Ext.fly('input-file').setVisible(true);
    Ext.fly('uploadCancel').remove();
} // uploadSuccess
 
var http=createRequestObject();

function createRequestObject() {
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer"){
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
	else{
		return new XMLHttpRequest();
	}   
} 
 
function DeleteUpload(filename) {
	http.open("GET", 'uploada.php?del=del&filename='+filename); 
	http.send(null);  
	Ext.fly(filename).remove();
}

function requestFilure () {
    alert ('Загрузка не удалась');
}
